/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.foxinline.servico;

import br.com.foxinline.modelo.Configuracao;
import br.com.foxinline.modelo.Grupo;
import br.com.foxinline.modelo.Usuario;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.Query;

/**
 *
 * @author ely
 */
@Stateless
public class GrupoServico extends ServicoGenerico<Grupo> {

    @EJB
    ConfiguracaoServico configuracaoServico;
    @EJB
    UsuarioServico usuarioServico;

    public GrupoServico() {
        super(Grupo.class);
    }

    @Override
    public List<Grupo> pesquisarTodos() {
        Configuracao configuracao = configuracaoServico.find();
        Usuario usuario = usuarioServico.getCurrentUser();

        String sql = "SELECT g FROM Grupo g WHERE g.id != 1 AND ";

        if (usuario.getId() != 1L) {
            sql += "(";
            if (configuracao.getProjetoTabularium()) {
                sql += " g.projetoTabularium = :tabularium OR ";
            }
            if (configuracao.getProjetoTabulario()) {
                sql += "g.projetoTabulario = :tabulario ";
            }
            
            sql += " ) AND ";
        }

        sql += " 1 = 1 ORDER BY g.id";

        Query query = getEntityManager().createQuery(sql);

        if (usuario.getId() != 1L) {
            if (configuracao.getProjetoTabularium()) {
                query.setParameter("tabularium", configuracao.getProjetoTabularium());
            }
            if (configuracao.getProjetoTabulario()) {
                query.setParameter("tabulario", configuracao.getProjetoTabulario());
            }
        }

        return query.getResultList();
    }

    public List<Grupo> findGrupos(Usuario u) {
        Configuracao configuracao = configuracaoServico.find();
        Usuario usuario = usuarioServico.getCurrentUser();

        String sql = "SELECT g FROM Usuario u JOIN u.grupos g WHERE u.id = :id AND g.id != 1 AND ";

        if (usuario.getId() != 1L) {
            sql += "(";
            if (configuracao.getProjetoTabularium()) {
                sql += " g.projetoTabularium = :tabularium OR ";
            }
            if (configuracao.getProjetoTabulario()) {
                sql += "g.projetoTabulario = :tabulario ";
            }
            
            sql += " ) AND ";
        }

        sql += "1 = 1 ORDER BY g.id";

        Query query = getEntityManager().createQuery(sql);
        query.setParameter("id", u.getId());

        if (usuario.getId() != 1) {
            if (configuracao.getProjetoTabularium()) {
                query.setParameter("tabularium", configuracao.getProjetoTabularium());
            }
            if (configuracao.getProjetoTabulario()) {
                query.setParameter("tabulario", configuracao.getProjetoTabulario());
            }
        }

        return query.getResultList();
    }

    public List<Grupo> findGruposE(Usuario u) {
        Configuracao configuracao = configuracaoServico.find();
        Usuario usuario = usuarioServico.getCurrentUser();

        String gruposId = "";
        for (Grupo g : u.getGrupos()) {
            gruposId += g.getId() + ",";
        }

        if (!gruposId.isEmpty()) {
            gruposId = gruposId.substring(0, gruposId.length() - 1);

            String sql = "select g from Grupo g where g.id not in (" + gruposId + ", 1) AND ";

            if (usuario.getId() != 1L) {
                sql += "(";
                if (configuracao.getProjetoTabularium()) {
                    sql += " g.projetoTabularium = :tabularium OR ";
                }
                if (configuracao.getProjetoTabulario()) {
                    sql += "g.projetoTabulario = :tabulario ";
                }

                sql += " ) AND ";
            }

            sql += "1 = 1 ORDER BY g.id";

            Query query = getEntityManager().createQuery(sql);

            if (usuario.getId() != 1L) {
                if (configuracao.getProjetoTabularium()) {
                    query.setParameter("tabularium", configuracao.getProjetoTabularium());
                }
                if (configuracao.getProjetoTabulario()) {
                    query.setParameter("tabulario", configuracao.getProjetoTabulario());
                }
            }

            return (List<Grupo>) query.getResultList();
        }

        return new ArrayList<Grupo>();
    }
    
    /**
     * Pesquisar a existência de um grupo com o nome informado
     * @param nome Nome do grupo a ser pesquisado
     * @return <b>grupo</b> 
     */
    public Grupo find(String nome){
        String sql = "SELECT g FROM Grupo g where lower(g.nome) like :nome";
        
        Query query = getEntityManager().createQuery(sql);
        query.setParameter("nome", nome.toLowerCase().replace(" ", "_"));
        
        return (Grupo) query.getSingleResult();
    }
}
